/**
 * <p>文件名:		TTTT.java</p>
 * <p>版权:		CopyrightTag</p>
 * <p>公司:		CompanyTag</p>
 * @author		周华彬(zhouhuabin@chinatransinfo.com, zhou_hua_bin@163.com)
*/

package com.caits.lbs.framework.utils;


import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

import javax.imageio.ImageIO;

import org.slf4j.Logger;

import com.caits.lbs.framework.Constants;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * <p>ImgCompress</p>
 * <p>图片压缩工具类</p>
 *
 * @author		周华彬(zhouhuabin@chinatransinfo.com, zhou_hua_bin@163.com)
 * @version		0.0.0
 * <table style="border:1px solid gray;">
 * <tr>
 * <th width="100px">版本号</th><th width="100px">动作</th><th width="100px">修改人</th><th width="100px">修改时间</th>
 * </tr>
 * <!-- 以 Table 方式书写修改历史 -->
 * <tr>
 * <td>0.0.0</td><td>创建类</td><td>zhouhuabin</td><td>2016年8月10日 上午9:40:18</td>
 * </tr>
 * <tr>
 * <td>XXX</td><td>XXX</td><td>XXX</td><td>XXX</td>
 * </tr>
 * </table>
 */

public class ImgageUtils {
	
	/** 变量:支付日志文件记录,类型:Logger */
	protected static Logger LOG = Constants.LOGSLF;
	
	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws Exception {
		System.out.println("开始：" + new Date().toLocaleString());
		boolean ret = compressImage("D:\\temp\\pic123.jpg",320, 320,"D:\\temp\\pic123_small.jpg");
		//imgCom.resizeFix();
		if(ret){
			LOG.info("图片压缩成功.");
		}else{
			LOG.info("图片压缩失败.");
		}
		System.out.println("结束：" + new Date().toLocaleString());
	}

	/**
	 * 可以正常实现bmp、png、gif转jpg 
	 * @param fileName	旧文件名
	 * @param w	新的大小
	 * @param h	新的高度
	 * @param newName	新的文件名
	 * @throws IOException void
	 */
	public static boolean compressImage(String fileName,int w, int h,String newName){
		try{
			File file = new File(fileName);// 读入文件
			Image img = ImageIO.read(file);      // 构造Image对象
			int width = img.getWidth(null);    // 得到源图宽
			int height = img.getHeight(null);  // 得到源图长
			return resizeFix(img,width,height,w, h,newName);
		}catch(IOException e){
			LOG.error("图片压缩异常,msg="+e.getLocalizedMessage(),e);
			return false;
		}
	}
	/**
	 * 按照宽度还是高度进行压缩
	 * @param w int 最大宽度
	 * @param h int 最大高度
	 */
	public static boolean resizeFix(Image img,int width ,int height,int w, int h,String newName){
		if (width / height > w / h) {
			int newh = (int) (height * w / width);
			return resize(img,w, newh,newName);
		} else {
			int neww = (int) (width * h / height);
			return resize(img,neww, h,newName);
		}
	}
	/**
	 * 强制压缩/放大图片到固定的大小
	 * @param w int 新宽度
	 * @param h int 新高度
	 */
	public static boolean resize(Image img,int newW, int newH,String newName){
		try{
			// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
			BufferedImage image = new BufferedImage(newW, newH,BufferedImage.TYPE_INT_RGB ); 
			image.getGraphics().drawImage(img, 0, 0, newW, newH, null); // 绘制缩小后的图
			File destFile = new File(newName);
			FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
			// 可以正常实现bmp、png、gif转jpg
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(image); // JPEG编码
			out.close();
			return true;
		}catch(IOException e){
			LOG.error("图片压缩异常,msg="+e.getLocalizedMessage(),e);
			return false;
		}
	}
}